"use strict";
const devFlag = process.env.NODE_ENV === "development";
const webpack = require("webpack");
//引入该插件
const CompressionWebpackPlugin = require("compression-webpack-plugin");
//匹配此 {RegExp} 的资源
const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;
module.exports = {
  publicPath: "/bpp-app", //生产
  // publicPath: "/", //测试
  lintOnSave: true,
  outputDir: "dist/bpp-app", //生产
  // outputDir: "dist", //测试
  assetsDir: "static",
  configureWebpack: (config) => {
    return {
      plugins: [
        new CompressionWebpackPlugin({
          // 开启gzip
          filename: "[path].gz[query]", //目标资源名称
          algorithm: "gzip",
          test: productionGzipExtensions, //处理所有匹配此 {RegExp} 的资源
          threshold: 10240, //只处理比这个值大的资源。按字节计算(楼主设置10K以上进行压缩)
          minRatio: 0.8, //只有压缩率比这个值小的资源才会被处理
          deleteOriginalAssets: false, // 是否删除原文件
        }),
      ],
      externals: {
        // vue: "Vue",
        // "iview": "iview",
        // "element-ui": "ELEMENT",
        // "vue-router": "VueRouter",
        // vuex: "Vuex",
        // axios: "axios",
        // moment: "moment",
        // xlsx: "XLSX",
        echarts: "echarts",
      },
      devtool: "source-map",
    };
    //     config.entry.app = ["babel-polyfill", "./src/main.js"];
  },

  // configureWebpack: {
  //     // 打包忽略文件
  //     externals: {
  //         // vue: "Vue",
  //         // "iview": "iview",
  //         // "element-ui": "ELEMENT",
  //         // "vue-router": "VueRouter",
  //         // vuex: "Vuex",
  //         // axios: "axios",
  //         // moment: "moment",
  //         // xlsx: "XLSX",
  //         echarts: 'echarts'
  //     },
  //     devtool: "source-map",
  // },
  pages: {
    index: {
      title: "",
      entry: "src/main.js",
      template: "public/index.html",
      filename: "index.html",
      chunks: ["chunk-vendors", "chunk-common", "index"],
      cdn: {
        //     css: [
        //         'https://cdn.bootcdn.net/ajax/libs/iview/3.5.5-rc.1/styles/iview.min.css'
        //     ],
        js: [
          "https://cdn.bootcdn.net/ajax/libs/echarts/5.1.1/echarts.min.js",
          //         "https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js",
          //         "https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js",
          //         "https://cdn.bootcdn.net/ajax/libs/iview/3.5.5-rc.1/iview.min.js"
          //         // "https://cdn.jsdelivr.net/npm/vue-router@3.4.5/dist/vue-router.min.js",
          //         // "https://cdn.jsdelivr.net/npm/vuex@3.0.1/dist/vuex.min.js",
          //         // "https://cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/index.js",
          //         // "https://cdn.jsdelivr.net/npm/axios@0.19.0/dist/axios.min.js",
          //         // "https://cdn.jsdelivr.net/npm/moment@2.24.0/moment.min.js",
          //         // "https://cdn.jsdelivr.net/npm/xlsx@0.16.7/dist/xlsx.full.min.js",
        ],
      },
    },
  },
  devServer: {
    // port: 60801,
    open: false, //设置true为打开默认浏览器
    // host: "local.gttest.com",
    compress: true,
    proxy: {
      "/auth": {
        target: "http://10.152.160.27:60411", // 测试
        changeOrigin: true, // 如果设置为true,那么本地会虚拟一个服务器接收你的请求并代你发送该请求，这样就不会有跨域问题（只适合开发环境）
        // pathRewrite: {
        //     '^/inno': '' // 重写路径
        // }
      },
      "/conf": {
        target: "http://10.152.160.27:60411", // 测试
        changeOrigin: true, // 如果设置为true,那么本地会虚拟一个服务器接收你的请求并代你发送该请求，这样就不会有跨域问题（只适合开发环境）
        // pathRewrite: {
        //     '^/inno': '' // 重写路径
        // }
      },
      "/companyInfo": {
        target: "http://10.152.160.27:60411", // 测试
        changeOrigin: true, // 如果设置为true,那么本地会虚拟一个服务器接收你的请求并代你发送该请求，这样就不会有跨域问题（只适合开发环境）
        // pathRewrite: {
        //     '^/inno': '' // 重写路径
        // }
      },
      "/financeInfo": {
        target: "http://10.152.160.27:60411", // 测试
        changeOrigin: true, // 如果设置为true,那么本地会虚拟一个服务器接收你的请求并代你发送该请求，这样就不会有跨域问题（只适合开发环境）
        // pathRewrite: {
        //     '^/inno': '' // 重写路径
        // }
      },
    },
    disableHostCheck: true,
    // 当出现编译器错误或警告时，在浏览器中显示
    overlay: {
      warnings: true,
      errors: true,
    },
  },
  productionSourceMap: true,
  // configureWebpack: {
  //     output: {
  //         filename: `static/js/[name].[hash].js`,
  //         chunkFilename: `static/js/[name].[hash].js`
  //     }
  // },
  // css: { //重点.
  //     extract: { // 打包后css文件名称添加时间戳
  //         filename: `static/css/[name].[hash].css`,
  //         chunkFilename: `static/css/[name].[hash].css`,
  //     }
  // },
  css: {
    // 是否使用css分离插件 extracttextplugin
    extract: !devFlag,
    // 开启 css source maps?
    // sourcemap: false,
    // css预设器配置项
    // loaderoptions: {},
    // 启用 css modules for all css / pre-processor files.
    requireModuleExtension: true,
    loaderOptions: {
      postcss: {
        plugins: [
          // 补全css前缀(解决兼容性)
          require("autoprefixer")(),
          //     {
          //     overrideBrowserslist: ['last 2 versions']
          // }
          // 把px单位换算成rem单位
          require("postcss-pxtorem")({
            rootValue: 37.5, // 根字体大小，如果设计图是750的话 记得除2
            // selectorBlackList: [".van", ".my-van", 'vant-'],// 要忽略的选择器并保留为px。
            propList: ["*"], //可以从px更改为rem的属性。
            minPixelValue: 2, // 设置要替换的最小像素值。
          }),
        ],
      },
    },
  },
  chainWebpack: (config) => {
    config.when(!devFlag, (config) => {
      config.optimization.minimizer("terser").tap((args) => {
        // 注释console.*
        args[0].terserOptions.compress.drop_console = true;
        // remove debugger
        args[0].terserOptions.compress.drop_debugger = true;
        // 移除 console.log
        args[0].terserOptions.compress.pure_funcs = ["console.log"];
        // 去掉注释 如果需要看chunk-vendors公共部分插件，可以注释掉就可以看到注释了
        args[0].terserOptions.output = {
          comments: false,
        };
        return args;
      });
    });
    // config.set('externals', {
    //     echarts: 'echarts'
    // });

    config.module
      .rule("min-image")
      .test(/\.(png|jpe?g|gif)(\?.*)?$/)
      .use("image-webpack-loader")
      .loader("image-webpack-loader")
      .options({
        disable: devFlag,
      }) //此处为ture的时候不会启用压缩处理,目的是为了开发模式下调试速度更快,网上错误示例直接写为disable:true,如果不去查看文档肯定是要被坑的
      .end();

    config.plugin("provide").use(webpack.ProvidePlugin, [
      {
        _: "lodash",
        $moment: "moment",
        qs: "qs",
      },
    ]);
    // 修复HMR
    config.resolve.symlinks(true);
    const oneOfsMap = config.module.rule("scss").oneOfs.store;
    oneOfsMap.forEach((item) => {
      item
        .use("sass-resources-loader")
        .loader("sass-resources-loader")
        .options({
          // Provide path to the file with resources
          // 要公用的scss的路径
          resources: "./src/assets/css/common.scss",
        })
        .end();
    });
  },
};
